import java.util.logging.Logger;
import com.google.appengine.api.datastore.*
import static com.google.appengine.api.datastore.FetchOptions.Builder.*
import src.de.checker.hochzeit.konstanten.*;
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.util.*;

Logger log = Logger.getLogger('NotificationController');

if(params?.notify ==~ /(?i)true/)
{
	notifyme()
}

private void notifyme()
{
	//Alle zu Benachrichtigenden raussuchen, die für die Checkliste sind
	def query = new Query(Konstanten.BENACHRICHTIGUNG)
	query.addFilter("typ",  Query.FilterOperator.EQUAL, 6);
	query.addFilter("wert",  Query.FilterOperator.EQUAL, true);
	PreparedQuery preparedQuery = datastore.prepare(query)
 	def ben = preparedQuery.asList( withLimit(100) )
 	def today= new Date()
	for(i in ben)
 	{
 		def gast = i.gast
 		log.info("Checkliste für Benachrichtigungen durchsuchen. Gast: "+gast)
 		Long tage = i.tage
 		def ab
 		use(org.codehaus.groovy.runtime.TimeCategory) {
	          ab = today + tage.toInteger().days
	    }
 		
 		def queryc = new Query(Konstanten.CHECKLISTE)
 		queryc.addFilter("fertigBis", Query.FilterOperator.LESS_THAN, ab);
 		queryc.addFilter("fertigBis", Query.FilterOperator.NOT_EQUAL, null);
 		queryc.addFilter("verantwortlicher", Query.FilterOperator.EQUAL, gast);
 		queryc.addFilter("notified", Query.FilterOperator.EQUAL, false);
 		PreparedQuery preparedQueryc = datastore.prepare(queryc)
 	 	def liste = preparedQueryc.asList( withLimit(100) )
 	 	if(!liste)
 	 		log.info("Keine Checklisteneinträge zum Benachrichtigen gefunden. Gast: "+gast)
 	 	else
 	 		sendMail(liste, gast)
 	}
	forward '/admin/ping.gtpl'
}
private void sendMail(List eintraege, Key user)
{
	def nutzer
	try
	{
		nutzer = datastore.get(user);
	}
	catch(Exception e)
	{
		log.warning('Fehler beim holen des Benutzers aus der Datenbank: '+user)
		log.warning(e.toString())
	}
	if(nutzer)
	{
		String mymail = getMail(user)
		if(mymail)
		{
			String body = "Hallo "+nutzer.vorname+" "+nutzer.nachname+",\n\nDie folgenden Einträge in deiner Checkliste stehen kurz vor der Deadline:\n\n"
			for(j in eintraege)
			{
				if(j.status == 0)
					body+= j.kurzbeschreibung+"\tStatus: offen\tLäuft ab am: "+Datehelper.date2String(j.fertigBis,'dd.MM.yyyy')+"\n"
				if(j.status == 1)
					body+= j.kurzbeschreibung+"\tStatus: in Arbeit\tLäuft ab am: "+Datehelper.date2String(j.fertigBis,'dd.MM.yyyy')+"\n"
				if(j.status == 2)
					body+= j.kurzbeschreibung+"\tStatus: erledigt\tLäuft ab am: "+Datehelper.date2String(j.fertigBis,'dd.MM.yyyy')+"\n"
			}
			body +="\nDie Details können im Hochzeitschecker im Menüpunkt Organisation / Checkliste eingesehen werden."
			System.out.println(body)
			try
			{
				mail.send sender: Konstanten.EMAIL_NO_REPLY,
					  to: mymail,
					  subject: "Erinnerung an Checklisteneinträge",
					  textBody: body
				log.info('E-Mail mit Erinnerung an Checklisteneinträgen versendet für '+user+' an die Mailadresse '+mail)
				//Die Einträge auf benachrichtigt setzen
				for(j in eintraege)
				{
					j.notified = true
					j.save()
				}
				createTracer(Konstanten.TRACER_EMAIL, 'Versende Mail an: '+mymail+' Typ: 6')
			}
			catch(Exception e)
			{
				log.warning("Fehler beim Versenden der E-Mail an: "+mymail)
				log.warning(e.toString())
			}
			
		}
	}
	
}
private String getMail(Key mkey)
{
	//E-Mail Adresse raussuchen
 	def query1 = new Query(Konstanten.TELEKOMM)
	query1.addFilter("gast", Query.FilterOperator.EQUAL, mkey.id)
	query1.addFilter("typ", Query.FilterOperator.EQUAL, new Long(0))
	PreparedQuery preparedQuery1 = datastore.prepare(query1)
	def entities1 = preparedQuery1.asList( withLimit(1) )
	if(entities1 && entities1.size() > 0)
	{
		def ma = entities1.get(0) 
		if(ma && ma.wert?.contains('@'))
		{
			return ma.wert
		}
		 else
			log.info('Keine gültige Mailadresse gefunden für Benutzer '+mkey+': '+ma.wert)
	}
	else
		log.info('Keine Mailadresse gefunden für ' +mkey)
 	return null
}
private void createTracer(String key, String message)
{
	try
	{
		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = null
	    t.nachricht = message
	    t.type = key
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		
	}
}
